#!/usr/bin/env python3
from launch import LaunchDescription # ROS 2 launch 系统的核心描述类
from launch.actions import ExecuteProcess, DeclareLaunchArgument # 用于执行外部命令（如 ros2 bag play） 声明launch参数
from launch.substitutions import LaunchConfiguration # 引用 launch 参数的值
from launch_ros.actions import Node # 用于启动 ROS 2 节点

def generate_launch_description():
    # 定义launch文件接收的参数变量
    bag_file = LaunchConfiguration('bag_file')  # ROS2 bag文件路径
    point_cloud_topic = LaunchConfiguration('point_cloud_topic')  # 点云话题名称
    use_sim_time = LaunchConfiguration('use_sim_time', default='true')  # 是否使用仿真时间
    
    # 声明需要从命令行传入的参数
    declare_bag_file_arg = DeclareLaunchArgument(
        'bag_file',  # 参数名称
        default_value='/home/cheng/Downloads/shuju/rosbag2_2025_09_08-15_59_48',  # 设置默认bag文件路径
        description='Path to the ROS2 bag file'  # 参数描述
    )
    
    declare_point_cloud_topic_arg = DeclareLaunchArgument(
        'point_cloud_topic',  # 参数名称
        default_value='/livox/lidar',  # 设置默认点云话题
        description='Point cloud topic name'  # 参数描述
    )
    
    # 启动ROS2 bag回放进程
    play_bag_cmd = ExecuteProcess(
        cmd=['ros2', 'bag', 'play', bag_file, '--clock', '-l'],  # 执行bag回放命令
        output='screen',  # 将命令输出显示到终端
        # shell=True  # 如果需要在shell环境中执行命令，取消注释此行
    )
    
    # 启动点云处理节点
    lidar_processor_node = Node(
        package='lidar_processing',  # 节点所在的ROS2包名
        executable='fu_ben3',  # 可执行文件名称
        name='lidar_process',  # 节点运行时的名称
        parameters=[
            {'use_sim_time': use_sim_time},  # 使用仿真时间同步
            {'input_cloud': point_cloud_topic}  # 指定输入点云话题
        ],
        output='screen'  # 将节点输出显示到终端
    )
    
    # 返回launch描述，包含所有要执行的动作
    return LaunchDescription([
        declare_bag_file_arg,  # 添加bag文件路径参数声明
        declare_point_cloud_topic_arg,  # 添加点云话题参数声明
        play_bag_cmd,  # 添加bag回放命令
        lidar_processor_node  # 添加点云处理节点
    ])